-- setup 
pvcreate /dev/xvdc1
pvcreate /dev/xvdd1

pvs
  PV         VG Fmt  Attr PSize    PFree
  /dev/xvdc1    lvm2 ---  <100.00g <100.00g
  /dev/xvdd1    lvm2 ---  <100.00g <100.00g

vgcreate vg_data /dev/xvdc1 /dev/xvdd1

vgs
  VG      #PV #LV #SN Attr   VSize   VFree
  vg_data   2   0   0 wz--n- 199.99g 199.99g


lvcreate -n lv_data -L 99G vg_data

mkfs.xfs /dev/vg_data/lv_data

mkdir /mnt/{original,snap}

mount /dev/vg_data/lv_data /mnt/original
echo "/dev/vg_data/lv_data    /mnt/original    xfs     defaults        0 0" >> /etc/fstab

-- snapshot creation
lvcreate -L 99G  -s /dev/vg_data/lv_data -n lv_snapshot

-- mount the snapshot LV (on XFS you should use -o nouuid option)
mount -o nouuid /dev/vg_data/lv_snapshot /mnt/snap/

-- emptying file on snapshot FS
> /mnt/snap/file_90G.raw

df -h /mnt/snap
Filesystem                       Size  Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_snapshot   99G   33M   99G   1% /mnt/snap

-- changes on snaphot FS does not affects data Data% usage on the snaphot LV
lvs
  LV          VG      Attr       LSize  Pool Origin  Data%  Meta%  Move Log Cpy%Sync Convert
  lv_data     vg_data owi-aos--- 99.00g
  lv_snapshot vg_data swi-aos--- 99.00g      lv_data 0.00

-- change 10Gb of data on source LV
dd if=/dev/zero of=/mnt/original/file_90G.raw bs=1G count=10

lvdisplay /dev/vg_data/lv_snapshot  | grep "Allocated to snapshot"
  Allocated to snapshot  10.14%

-- revert to a snapshot
umount /mnt/{original,snap}

lvconvert --merge /dev/vg_data/lv_snapshot

-- if the COW space is exhausted, LV snapshot status become INACTIVE
-- we cannot revert from an INACTIVE snapshot

lvdisplay /dev/vg_data/lv_snapshot | grep "LV snapshot status"
  LV snapshot status     INACTIVE destination for lv_data

lvconvert --merge /dev/vg_data/lv_snapshot
  Unable to merge invalidated snapshot LV "lv_snapshot".

-- remove a snapshot
lvremove /dev/vg_data/lv_snapshot

